# _*_ coding: utf-8 _*_
# _*_ coding: utf-8 _*_
import pymysql
import time
from DBUtils.PooledDB import PooledDB, SharedDBConnection
POOL = PooledDB(
    creator=pymysql,  # 使用链接数据库的模块
    maxconnections=10,  # 连接池允许的最大连接数，0和None表示不限制连接数
    mincached=2,  # 初始化时，链接池中至少创建的空闲的链接，0表示不创建
    maxcached=5,  # 链接池中最多闲置的链接，0和None不限制
    maxshared=3,  # 链接池中最多共享的链接数量，0和None表示全部共享。PS: 无用，
                  # 因为pymysql和MySQLdb等模块的 threadsafety都为1，所有值无论
                  # 设置为多少，_maxcached永远为0，所以永远是所有链接都共享。
    blocking=True,  # 连接池中如果没有可用连接后，是否阻塞等待。True，等待；False，不等待然后报错
    maxusage=None,  # 一个链接最多被重复使用的次数，None表示无限制
    setsession=[],  # 开始会话前执行的命令列表。如：["set datestyle to ...", "set time zone ..."]
    ping=0,
    host='×××', #测试
    port=3306,
    user='root',        #用户名
    password='×××',      #密码
    database='env',   #库名
    charset='utf8',
    cursorclass = pymysql.cursors.DictCursor # 配置数据已字典的类型返回，不配置返回元组
    # 在默认情况下cursor方法返回的是BaseCursor类型对象，BaseCursor类型对象在执行查询后每条记录的结果以列表(list)表示。
    # 如果要返回字典(dict)表示的记录，就要设置cursorclass参数为pymysql.cursors.DictCursor类。
)


def insert(tableName,dataSource,fun="insert"):
    param = ""
    value = ""
    for key in dataSource:
        if dataSource[key] is not None:
            param = param + "`" + key + "`" +","
            value = value + "'" + str(dataSource[key]) + "'" + ","
    sql = "%s into %s (%s) value (%s);" % (fun,tableName,param[:-1],value[:-1])
    conn = POOL.connection()
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        print('执行失败', sql)
        conn.rollback()
    else:
        print('执行成功',sql)
    cursor.close()
    conn.close()

def update(tableName,dataSource):
    param = ""
    value = ""
    for key in dataSource:
        param = param + key + "=" + "'" + str(dataSource[key]) + "'" +","
    sql = "UPDATE %s SET %s where his_id = '%s'" % (tableName, param[:-1], dataSource["his_id"])
    #sql = "insert into %s (%s) value (%s);" % (tableName,param[:-1],value[:-1])
    conn = POOL.connection()
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        print('执行失败', sql)
        conn.rollback()
    else:
        print('执行成功',sql)
    cursor.close()
    conn.close()

def getInfoToSqlAll(sql):
    start = time.time()
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql)
    result = cursor.fetchall();
    cursor.close()
    conn.close()
    end = time.time()
    print("查询sql：", sql, "结果是：", result,"执行时间: %s seconds" % (end - start))
    return result


def getInfoToSqlOne(sql):
    start = time.time()
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql)
    result = cursor.fetchone();
    cursor.close()
    conn.close()
    end = time.time()
    print("查询sql：", sql, "结果是：", result,"执行时间: %s seconds" % (end - start))
    return result

def execute(sql):
    conn = POOL.connection()
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        print('执行失败', sql)
        conn.rollback()
    else:
        print('执行成功',sql)
    cursor.close()
    conn.close()
